package com.qdu.dao.impl;
import com.qdu.dao.BaseDao;
import com.qdu.util.DatabaseUtil;
import java.lang.reflect.ParameterizedType;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.lang.reflect.ParameterizedType;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;



/**
 * BaseDao接口的实现类BaseDaoImpl，实现了BaseDao接口定义的共同操作
 *
 * @author Anna
 */

public class  BaseDaoImpl<T> implements BaseDao{

    @Override
    public int executeUpdate(String sql, Object... params) {
        
        Connection con = null;
        PreparedStatement ps = null;
        int rows = 0; 
        
        try {
            con = DatabaseUtil.getConnection();
            ps = con.prepareStatement(sql);
            //Object... params是可变参数，说明可以传入任意多个Object对象作为参数
            //操作这些参数的时候以数组操作即可，参数名params就是数组名
            for(int i=0;i<params.length;i++){
                ps.setObject(i+1,params[i]); //将sql语句中的第i+1个参数的值设置为数组中索引为i的元素的值
            }   
            rows = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DatabaseUtil.close(null, ps, con);
        }
        return rows;
    }
    /*                        实现Dao接口的方法 用户管理员的登录注册                                              */
       // 需要获取实际的type
    private Class<T> type;

    private QueryRunner queryRunner = new QueryRunner();

    @SuppressWarnings("unchecked")
    public BaseDaoImpl(){
        // 获取父类的类型,父类是带参数的
        ParameterizedType superclass = (ParameterizedType) this.getClass().getGenericSuperclass();
        System.out.println(superclass.getClass());
        // 获取泛型中的具体的类型的class
        type = (Class<T>) superclass.getActualTypeArguments()[0];
    }

    /**
     * 获取一个对象
     * @param sql  sql语句
     * @param params 可变参数
     * @return
     */
    public T getBean(String sql, Object...params){
        Connection connection = DatabaseUtil.getConnection();
        T query = null;
        try {
            // 查询一个数据
            query = queryRunner.query(connection,sql,new BeanHandler<>(type),params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
           DatabaseUtil.closeConnection(connection);
        }
        return query;
    }


    /**
     * 获取对象的集合
     * @return
     */
    public List<T> getBeanList(String sql, Object...params){
        Connection connection = DatabaseUtil.getConnection();
        List<T> query = null;
        try {
            // 查询一组数据
            query = queryRunner.query(connection,sql,new BeanListHandler<>(type),params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DatabaseUtil.closeConnection(connection);
        }

        return query;
    }

    /**
     * 执行增删改
     */
    public int update(String sql, Object ...params){
        int count = 0;
        Connection connection = DatabaseUtil.getConnection();
        try {
            count = queryRunner.update(connection, sql, params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DatabaseUtil.closeConnection(connection);
        }
        return count;
    }
        /*                        实现Dao接口的方法 用户管理员的登录注册                                              */
}